﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestorDeFlotasModelo.Factorias;
using GestorDeFlotasModelo.Entities;
using GestorDeFlotasDesktop.UILogic;
using GestorDeFlotasDesktop.UILogic.Helpers;

namespace GestorDeFlotasDesktop
{
    public partial class FormCliente : BaseForm
    {
        private Int64 CurrentUserId { get; set; }
        private FormMode Mode { get; set; }

        public FormCliente()
        {
            InitializeComponent();
        }

        protected override void  OnVisibleChanged(EventArgs e)
        {
            try
            {
                base.OnVisibleChanged(e);
                PrepareForm(this.Mode);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        #region Private Members
        private void btnAddOrUpdate_Click(object sender, EventArgs e)
        {
            try
            {
                if (!ValidateFields())
                {
                    if (Mode == FormMode.Add)
                    {

                        Cliente cliente = Transaccion.Factoria<FactoriaCliente>().Nuevo(txtUserName.Text, txtApellido.Text,
                                                                                        txtCodigoPostal.Text,
                                                                                        txtDireccion.Text, long.Parse(txtDni.Text),
                                                                                        long.Parse(txtTel.Text), dtpFechaNac.Value,
                                                                                        txtMail.Text);
                        Transaccion.Persistir();
                    }
                    else
                    {
                        if (CurrentUserId <= 0)
                            lblError.Text += "No hay ningún cliente seleccionado";
                        else
                        {
                            Cliente cliente = Transaccion.Factoria<FactoriaCliente>().SelectXId<Cliente>(CurrentUserId.ToString());

                            cliente.Habilitado = chkEnabled.Checked;
                            cliente.Telefono = long.Parse(txtTel.Text);
                            cliente.Nombre = txtUserName.Text;
                            cliente.Mail = txtMail.Text;
                            cliente.FechaNacimiento = dtpFechaNac.Value;
                            cliente.Dni = long.Parse(txtDni.Text);
                            cliente.Direccion = txtDireccion.Text;
                            cliente.CodigoPostal = txtCodigoPostal.Text;
                            cliente.Apellido = txtApellido.Text;

                            Transaccion.Persistir();
                        }
                    }
                    if (string.IsNullOrEmpty(lblError.Text))
                    {
                        AbmCliente list = new AbmCliente();
                        list.Show();
                        this.Close();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private bool ValidateFields()
        {
            bool error = false;
            string errorMessage = string.Empty;

            if (!ValidatorHelper.isStringFieldValid(txtUserName.Text))
            {
                errorMessage = "No ingresaste el nombre \n";
                error = true;
            }

            if (!ValidatorHelper.isStringFieldValid(txtApellido.Text))
            {
                errorMessage += "No ingresaste el apellido \n";
                error = true;
            }

            if (!ValidatorHelper.isNumericLongFieldValid(txtDni.Text))
            {
                errorMessage += "No ingresaste el dni \n";
                error = true;
            }

            if (!ValidatorHelper.isStringFieldValid(txtCodigoPostal.Text))
            {
                errorMessage += "No ingresaste el codigo postal \n";
                error = true;
            }

            if (!ValidatorHelper.isNumericLongFieldValid(txtDni.Text))
            {
                errorMessage += "No ingresaste el dni \n";
                error = true;
            }

            if (!ValidatorHelper.isStringFieldValid(txtDireccion.Text))
            {
                errorMessage += "No ingresaste la dirección \n";
                error = true;
            }

            if (!ValidatorHelper.isNumericLongFieldValid(txtTel.Text))
            {
                errorMessage += "No ingresaste el teléfono correctamente \n";
                error = true;
            }
            else
            {
                //En este punto se valida que no haya 2 telefonos iguales.
                int countTelefono = Transaccion.Factoria<FactoriaCliente>().GetCountTelefonos(long.Parse(txtTel.Text));

                if ((Mode == FormMode.Update && countTelefono > 1) || (Mode == FormMode.Add && countTelefono == 1))
                {
                    error = true;
                    errorMessage = "El telefono ingresado ya existe \n";
                }
            }

            if (dtpFechaNac.Value == null)
            {
                errorMessage += "No ingresaste una fecha de nacimiento \n";
                error = true;
            }


            lblError.Text = errorMessage;
            lblError.Visible = error;

            return error;
        }

        private void ResetFields()
        {
            txtUserName.Text = txtApellido.Text = lblError.Text = string.Empty;
            lblError.Visible = false;
            txtUserName.ReadOnly = false;
        }

        private void PrepareForm(FormMode mode)
        {
            if (mode == FormMode.Add)
            {
                lblHabilitado.Visible = false;
                chkEnabled.Visible = false;
                btnAddOrUpdate.Text = "Agregar";
            }
            else
            {
                lblHabilitado.Visible = true;
                chkEnabled.Visible = true;
                btnAddOrUpdate.Text = "Modificar";
            }
        }

        private void LoadData(Cliente cliente)
        {
            txtUserName.Text = cliente.Nombre;
            txtApellido.Text = cliente.Apellido;
            txtCodigoPostal.Text = cliente.CodigoPostal;
            txtDireccion.Text = cliente.Direccion;
            txtDni.Text = cliente.Dni.ToString();
            txtMail.Text = cliente.Mail;
            txtTel.Text = cliente.Telefono.ToString();
            chkEnabled.Checked = cliente.Habilitado;
            dtpFechaNac.Value = cliente.FechaNacimiento;
        }
        #endregion
        public void LoadForm(FormMode mode, Cliente cliente)
        {
            
            this.Mode = mode;
            ResetFields();

            if (mode == FormMode.Add) this.CurrentUserId = 0;
            else
            {
                LoadData(cliente);
                this.CurrentUserId = cliente.Id;
            }
        }


    }
}